package novel.manager.service.impl.spider.chapter;

import java.util.Map;

import novel.manager.pojo.spider.ChapterDetail;
import novel.manager.pojo.spider.NovelSiteEnum;
import novel.manager.service.iface.spider.chapter.IChapterDetailSpider;
import novel.manager.service.impl.spider.AbstractSpider;
import novel.manager.service.utils.NovelSpiderUtil;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
/**抓取任意网站的章节详细内容*/
public abstract class AbstractChapterDetailSpider extends AbstractSpider implements IChapterDetailSpider{
	
	@Override
	//url:章节页面
	public ChapterDetail getChapterDetail(String url) {
		try {
			ChapterDetail detail = new ChapterDetail();
			//抓取指定小说网站的整个页面所有内容
			String result = super.crawl(url);
			//处理空格和换行，&nbsp;会显示"？"，<br />不会显示，jsoup解析时会忽略“\n”，所以要把&nbsp;替换为“”，把<br />替换为待定的自定义字符${line}
			result = result.replace("&nbsp;", " ").replace("<br />", "${line}").replace("<br/>", "${line}");
			//Jsoup.parse解析HTML字符串到内存的Document中
			Document doc = Jsoup.parse(result);
			//设置网页的基本路径，因为网页中有的用的是相对路径
			doc.setBaseUri(url);
			//先获取指定url的NovelSiteEnum，然后根据NovelSiteEnum获取对应网站的解析规则的map形式
			Map<String, String> contexts = NovelSpiderUtil.getSpiderRuleMapByNovelSiteEnum(NovelSiteEnum.getEnumByUrl(url));
			//0.获取编码格式
			
			//1.拿标题内容
			String titleSelector = contexts.get("chapter-detail-title-selector");
			/*"\\|"就是表示"|"
			|属于正则中的元字符，表示或的意思，因此表示'|'字符本身必须转义
			java中\本身具有转义作用，\\表示\ ,'\\|'传给正则就是"\|",表示对|进行转义，不作为特殊字符使用*/
			String[] splits = titleSelector.split("\\,");
			//补充默认的索引0
			splits = parseSelector(splits);
			System.out.println("splits:"+splits[0]+";"+splits[1]);
			//提取并封装
			detail.setTitle(doc.select(splits[0]).get(Integer.parseInt(splits[1])).text());			
			//2.拿章节内容
			String contentSelector = contexts.get("chapter-detail-content-selector");
			//提取并封装，把自定义的${line}转为“\n”
			detail.setContent(doc.select(contentSelector).first().text().replace("${line}", "\n"));			
			//3.拿前一章的地址
			String prevSelector = contexts.get("chapter-detail-prev-selector");
			splits = prevSelector.split("\\,");
			splits = parseSelector(splits);
			System.out.println("splits:"+splits[0]+";"+splits[1]);
			//提取并封装
			Elements  elements =doc.select(splits[0]);
			System.out.println("elements:"+elements);
			Element  element =elements.get(Integer.parseInt(splits[1]));
			System.out.println("element:"+element);
			String href=element.absUrl("href");
			System.out.println("href:"+href);
			detail.setPrev(href);			
			//4.拿后一章的地址
			String nextSelector = contexts.get("chapter-detail-next-selector");
			splits = nextSelector.split("\\,");
			splits = parseSelector(splits);
			System.out.println("splits2:"+splits[0]+";"+splits[1]);
			//提取并封装
			detail.setNext(doc.select(splits[0]).get(Integer.parseInt(splits[1])).absUrl("href"));
			System.out.println("detail:"+detail);
			return detail;
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}
	
	/**
	 * 处理具体元素的下标索引：补充默认的索引0
	 */
	private String[] parseSelector(String[] splits) {
		String[] newSplits = new String[2];
		if (splits.length == 1) {
			newSplits[0] = splits[0];
			newSplits[1] = "0";
			return newSplits;
		} else {
			return splits;
		}
	}

}
